<!doctype html>



  


<html class="theme-next muse use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Hexo, NexT" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="Hi! 欢迎来到我的博客，希望这里的知识能够帮助到你！">
<meta property="og:type" content="website">
<meta property="og:title" content="Motom 的 秘密树屋">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Motom 的 秘密树屋">
<meta property="og:description" content="Hi! 欢迎来到我的博客，希望这里的知识能够帮助到你！">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Motom 的 秘密树屋">
<meta name="twitter:description" content="Hi! 欢迎来到我的博客，希望这里的知识能够帮助到你！">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Muse',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://yoursite.com/"/>

  <title> Motom 的 秘密树屋 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-left 
   page-home 
 ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">Motom 的 秘密树屋</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle"></p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/10/09/---/" itemprop="url">
                  未命名
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-10-09T02:46:23Z" content="2016-10-09">
              2016-10-09
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <hr>
<h2 id="title-2016&#x5E74;&#x4E0B;&#x534A;&#x5E74;&#xFF0F;2&#x603B;&#x7ED3;"><a href="#title-2016&#x5E74;&#x4E0B;&#x534A;&#x5E74;&#xFF0F;2&#x603B;&#x7ED3;" class="headerlink" title="title:2016&#x5E74;&#x4E0B;&#x534A;&#x5E74;&#xFF0F;2&#x603B;&#x7ED3;"></a>title:2016&#x5E74;&#x4E0B;&#x534A;&#x5E74;&#xFF0F;2&#x603B;&#x7ED3;</h2><h1 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h1><p>10.9<br>2016&#x5E74;&#x8FC7;&#x53BB;&#x4E86;3&#xFF0F;4&#xFF0C;&#x5230;&#x73B0;&#x5728;&#x53D8;&#x5316;&#x6700;&#x5927;&#x7684;&#x5E94;&#x8BE5;&#x662F;&#x81EA;&#x5DF1;&#x771F;&#x6B63;&#x7684;&#x638C;&#x63E1;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x4EBA;&#x751F;&#xFF0C;</p>
<p><img src="http://i1.piimg.com/4851/ac5bd3d8e872ae0c.jpg" alt=""><br>&#x6700;&#x8FD1;&#x5F00;&#x59CB;&#x505A;&#x8BA1;&#x5212;&#x8868;&#x683C;&#xFF0C;&#x5C06;&#x6BCF;&#x4E00;&#x5929;&#x7684;&#x8BA1;&#x5212;&#x90FD;&#x5217;&#x51FA;&#x6765;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x7167;&#x8BA1;&#x5212;&#x53BB;&#x5B8C;&#x6210;&#xFF0C;&#x521A;&#x521A;&#x6B65;&#x5165;&#x5927;&#x56DB;&#xFF0C;&#x751F;&#x6D3B;&#x6765;&#x8BF4;&#xFF0C;&#x53D8;&#x5316;&#x662F;&#x5DE8;&#x5927;&#x7684;&#xFF0C;&#x9996;&#x5148;&#x5728;&#x516C;&#x53F8;&#x5B9E;&#x4E60;&#xFF0C;&#x5F00;&#x59CB;&#x6B65;&#x5165;&#x793E;&#x4F1A;&#xFF0C;&#x5F00;&#x59CB;&#x4E86;&#x65B0;&#x7684;&#x7ADE;&#x4E89;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x4E92;&#x8054;&#x7F51;&#xFF0C;&#x5BF9;&#x4E8E;&#x6211;&#x6765;&#x8BF4;&#xFF0C;&#x73B0;&#x5728;&#x6211;&#x5904;&#x7684;&#x4F4D;&#x7F6E;&#x5E76;&#x4E0D;&#x662F;&#x6211;&#x60F3;&#x8981;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD9;&#x4E48;&#x8BF4;&#xFF0C;&#x5176;&#x5B9E;&#x6BCF;&#x4E2A;&#x7801;&#x519C;&#x5FC3;&#x91CC;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x68A6;&#x60F3;&#xFF0C;&#x6211;&#x7684;&#x68A6;&#x60F3;&#x662F;&#x505A;&#x51FA;&#x4EBA;&#x4EBA;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF0C;&#x80FD;&#x591F;&#x6539;&#x53D8;&#x751F;&#x6D3B;&#x7684;&#x4E00;&#x6B3E;&#x8F6F;&#x4EF6;&#xFF0C;&#x53C8;&#x6216;&#x8005;&#x662F;&#x4E00;&#x6B3E;&#x80FD;&#x5B9E;&#x73B0;&#x4EBA;&#x5FC3;&#x4E2D;&#x68A6;&#x60F3;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x4E0D;&#x8BBA;&#x662F;&#x817E;&#x8BAF;&#xFF0C;&#x6DD8;&#x5B9D;&#xFF0C;&#x8FD8;&#x662F;&#x767E;&#x5EA6;&#xFF0C;&#x65F6;&#x65F6;&#x523B;&#x523B;&#x5B58;&#x5728;&#x4E8E;&#x751F;&#x6D3B;&#x5F53;&#x4E2D;&#x3002;&#x53EF;&#x80FD;&#x6709;&#x70B9;&#x8BF4;&#x5927;&#x8BDD;&#x7684;&#x6837;&#x5B50;&#xFF0C;&#x4F46;&#x5185;&#x5FC3;&#x91CC;&#x771F;&#x7684;&#x60F3;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x68A6;&#x60F3;&#x3002;</p>
<p>&#x4ECA;&#x5E74;&#x5E94;&#x8BE5;&#x662F;&#x4E00;&#x4E2A;&#x4E8B;&#x4E1A;&#x5E74;&#xFF0C;&#x5DE5;&#x4F5C;&#x5E74;&#xFF0C;&#x4ECE;&#x5E74;&#x5047;&#x56DE;&#x6765;&#x5F00;&#x59CB;&#xFF0C;&#x5C31;&#x4E00;&#x76F4;&#x5728;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x4E00;&#x76F4;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x5F00;&#x59CB;&#x5B66;&#x4E60;&#x5409;&#x4ED6;&#x4E86;&#xFF0C;&#x81EA;&#x5DF1;&#x4EBA;&#x751F;&#x6323;&#x5F97;&#x7B2C;&#x4E00;&#x7B14;&#x94B1; &#x4E70;&#x4E86;&#x4E00;&#x628A;&#x597D;&#x5409;&#x4ED6;&#xFF0C;&#x5C0F;&#x65F6;&#x5019;&#x5C31;&#x60F3;&#x4E70;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x5B66;&#x4E1A;&#x6216;&#x8005;&#x5176;&#x4ED6;&#x7684;&#x7410;&#x4E8B;&#x5C31;&#x4E00;&#x76F4;&#x6401;&#x7F6E;&#xFF0C;&#x73B0;&#x5728;&#x7EC8;&#x4E8E;&#x80FD;&#x591F;&#x5B66;&#x4E00;&#x5B66;&#x5566;&#xFF08;&#x5409;&#x4ED6;&#x4E0D;&#x80FD;&#x5403;&#x7070;&#xFF01;&#xFF09;&#x3002;</p>
<p>&#x4ECA;&#x5E74;&#x8FDB;&#x884C;&#x4E86;&#x4E0D;&#x5C11;&#x9009;&#x62E9;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x9009;&#x62E9;&#x90FD;&#x4F1A;&#x6539;&#x53D8;&#x4EBA;&#x751F;&#x7684;&#x65B9;&#x5411;&#xFF0C;&#x6CA1;&#x4EBA;&#x77E5;&#x9053;&#x9009;&#x7684;&#x5BF9;&#x9519;&#xFF0C;&#x4E5F;&#x6CA1;&#x4EBA;&#x77E5;&#x9053;&#x7ED3;&#x679C;&#x5982;&#x4F55;&#xFF0C;&#x552F;&#x4E00;&#x786E;&#x5B9A;&#x7684;&#x662F;&#xFF0C;&#x53EA;&#x8981;&#x9009;&#x62E9;&#xFF0C;&#x603B;&#x4F1A;&#x6709;&#x5931;&#x53BB;&#x7684;&#x4E1C;&#x897F;&#x3002;</p>
<p>ios&#x884C;&#x4E1A;&#x4F3C;&#x4E4E;&#x73B0;&#x5728;&#x7684;&#x201C;&#x884C;&#x60C5;&#x201D;&#x5E76;&#x4E0D;&#x4E50;&#x89C2;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x9009;&#x62E9;ios&#x800C;&#x4E0D;&#x662F;java&#xFF0C;javaweb&#x6216;&#x8005;&#x5176;&#x4ED6;&#x7684;&#x65B9;&#x9762;&#x5462;&#xFF1F; &#x79FB;&#x52A8;&#x7AEF;ios&#x5176;&#x5B9E;&#x4EE3;&#x8868;&#x4E86;&#x4E00;&#x79CD;&#x96C5;&#xFF0C;&#x4E0D;&#x8BBA;&#x662F;app&#x7684;&#x8D28;&#x91CF; &#x8FD8;&#x662F; &#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;&#x98CE;&#x683C;&#xFF0C;&#x90FD;&#x4F3C;&#x4E4E;&#x975E;&#x5E38;&#x7684;&#x827A;&#x672F;&#xFF0C;&#x656C;&#x4F69;&#x4E54;&#x5E03;&#x65AF;&#xFF0C;&#x5C06;&#x827A;&#x672F;&#x5E26;&#x5165;&#x4E86;&#x79D1;&#x6280;&#x5143;&#x7D20;&#x3002;&#x7136;&#x800C;&#x6211;&#x73B0;&#x5728;&#x53EA;&#x662F;&#x4E2A;&#x7801;&#x519C;&#xFF0C;&#x4ECE;app&#x505A;&#x8D77;&#xFF0C;&#x5E0C;&#x671B;&#x4EE5;&#x540E;&#x80FD;&#x6709;&#x673A;&#x4F1A;&#x6D89;&#x53CA;&#x5230;&#x4EA7;&#x54C1;&#x7684;&#x8BBE;&#x8BA1;&#x4E2D;&#x53BB;&#x3002;</p>
<p>&#x6BD5;&#x4E1A;&#x79BB;&#x6211;&#x4EEC;&#x8D8A;&#x6765;&#x8D8A;&#x8FD1;&#x4E86;&#xFF0C;&#x540C;&#x5B66;&#x627E;&#x5DE5;&#x4F5C;&#x7684;&#x627E;&#x5DE5;&#x4F5C;&#xFF0C;&#x5B9E;&#x4E60;&#x7684;&#x5B9E;&#x4E60;&#xFF0C;&#x5927;&#x5BB6;&#x4F3C;&#x4E4E;&#x90FD;&#x8981;&#x5206;&#x9053;&#x626C;&#x9573;&#x4E86;&#xFF0C;&#x5C31;&#x50CF;&#x6700;&#x8FD1;&#x5F88;&#x706B;&#x7684;&#x4E00;&#x4E2A;&#x7535;&#x5F71;&#xFF0C;&#x300A;&#x4ECE;&#x4F60;&#x7684;&#x5168;&#x4E16;&#x754C;&#x8DEF;&#x8FC7;&#x300B;  &#x6211;&#x4EEC;&#x90FD;&#x662F;&#x8D76;&#x8DEF;&#x7684;&#x4EBA;&#xFF0C;&#x56E0;&#x4E3A;&#x8981;&#x8D70;&#x4E00;&#x6BB5;&#x76F8;&#x540C;&#x7684;&#x8DEF;&#x7A0B;&#xFF0C;&#x4E92;&#x76F8;&#x966A;&#x4F34;&#x524D;&#x884C;&#xFF0C;&#x8FD9;&#x6BB5;&#x8DEF;&#x8D70;&#x5B8C;&#x4E86;&#xFF0C;&#x5927;&#x5BB6;&#x5C31;&#x5404;&#x81EA;&#x8E0F;&#x4E0A;&#x81EA;&#x5DF1;&#x7684;&#x65C5;&#x9014;&#xFF0C;&#x4EE5;&#x540E;&#x8FD8;&#x4F1A;&#x8BA4;&#x8BC6;&#x8BB8;&#x591A;&#x4EBA;&#xFF0C;&#x9047;&#x5230;&#x8BB8;&#x591A;&#x4E8B;&#xFF0C;&#x4F46;&#x518D;&#x4E5F;&#x56DE;&#x4E0D;&#x5230;&#x8FC7;&#x53BB;&#xFF0C;&#x7559;&#x4E0B;&#x7684;&#x53EA;&#x6709;&#x56DE;&#x5FC6;&#x3002;  &#x6709;&#x4E00;&#x53E5;&#x8BDD;&#x8BF4; &#x522B;&#x5984;&#x60F3;&#x628A;&#x773C;&#x524D;&#x7684;&#x98CE;&#x666F;&#xFF0C;&#x53D8;&#x6210;&#x6B64;&#x751F;&#x4E0D;&#x53D8;&#x7684;&#x6C38;&#x6052;&#x3002;&#x6216;&#x8BB8;&#x6211;&#x4EEC;&#x8981;&#x7ECF;&#x5386;&#x4E0D;&#x65AD;&#x544A;&#x522B;&#xFF0C;&#x4E0D;&#x65AD;&#x56DE;&#x5FC6;&#xFF0C;&#x624D;&#x80FD;&#x61C2;&#x5F97;&#x5728;&#x4E00;&#x8D77;&#x90A3;&#x6BB5;&#x65F6;&#x5149;&#x662F;&#x591A;&#x4E48;&#x5F25;&#x8DB3;&#x73CD;&#x8D35;&#x3002;</p>
<p>&#x521D;&#x4E2D;&#x8D77;&#x5C31;&#x5916;&#x51FA;&#x8BFB;&#x4E66;&#xFF0C;&#x521D;&#x4E2D;3&#x5E74;&#xFF0C;&#x9AD8;&#x4E2D;3&#x5E74;&#xFF0C;&#x5927;&#x5B66;4&#x5E74;&#xFF0C;&#x5728;&#x5916;&#x8BFB;&#x4E66;&#x7684;&#x65E5;&#x5B50;&#x770B;&#x6765;&#x591A;&#x591A;&#x5C11;&#x5C11;&#x4E5F;&#x5F71;&#x54CD;&#x5230;&#x4E86;&#x6211;&#xFF0C;&#x7537;&#x5B69;&#x5728;&#x5916;&#x603B;&#x662F;&#x6F02;&#x6CCA;&#xFF0C;&#x72EC;&#x81EA;&#x4E00;&#x4EBA;&#x3002;&#x6709;&#x7684;&#x65F6;&#x5019;&#x5BF9;&#x4E8E;&#x522B;&#x4EBA;&#x7684;&#x5173;&#x5FC3;&#x832B;&#x7136;&#x4E0D;&#x77E5;&#xFF0C;&#x60F3;&#x8D77;&#x4E4B;&#x524D;&#x7684;&#x8BB8;&#x591A;&#x5C0F;&#x4E8B;&#xFF0C;&#x624D;&#x53D1;&#x73B0;&#x4E86;&#x522B;&#x4EBA;&#x7684;&#x597D;&#x3002;</p>
<p>&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;-&#x5206;&#x5272;&#x7EBF;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;&#x2014;</p>
<p>10.27&#x66F4;</p>
<p><img src="http://p1.bqimg.com/4851/2bf708707b74e04b.png" alt=""></p>
<p>&#x5341;&#x6708;&#x4EFD;&#x4F3C;&#x4E4E;&#x6CA1;&#x6709;&#x505A;&#x4EC0;&#x4E48;- - &#xFF0C;1-7&#x53F7;&#x4F11;&#x5047;  &#x4F11;&#x5047;&#x56DE;&#x6765;&#x4E4B;&#x540E;&#x7684;&#x4E00;&#x5468;&#x4E3B;&#x8981;&#x5728;&#x505A;  &#x7B2C;&#x4E8C;&#x4E91;&#x8BFE;&#x5802; &#x9879;&#x76EE;&#xFF0C;&#x5305;&#x62EC;&#x7F16;&#x5199;&#x6587;&#x6863;&#xFF0C;&#x505A;app&#x6548;&#x679C;&#x56FE;&#xFF0C;&#x4EE5;&#x53CA;&#x4EFB;&#x52A1;&#x90E8;&#x7F72;&#xFF0C;&#x5BF9;&#x4E8E;&#x6211;&#x6765;&#x8BF4;&#x662F;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5B66;&#x4E60;&#x673A;&#x4F1A;&#xFF0C;&#x4E5F;&#x80FD;&#x5F00;&#x9614;&#x4E00;&#x4E0B;&#x81EA;&#x5DF1;&#x7684;&#x773C;&#x754C;&#xFF0C;&#x53E6;&#x5916;&#x5F00;&#x59CB;&#x63A5;&#x89E6;cocos2d&#xFF0C;&#x5F00;&#x59CB;&#x505A;&#x624B;&#x6E38;&#xFF0C;&#x4F46;&#x662F;&#x5468;&#x4E94;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x70E7;&#xFF0C;&#x8FDE;&#x7EED;&#x70E7;&#x4E86; 3&#xFF0C;4&#x5929;&#xFF0C;&#x8FD9;&#x51E0;&#x5929;&#x51E0;&#x4E4E;&#x4EC0;&#x4E48;&#x90FD;&#x6CA1;&#x505A; &#x5168;&#x7A0B;&#x5212;&#x6C34;&#xFF0C;&#x4E00;&#x76F4;&#x96BE;&#x53D7;&#x8179;&#x6CFB;&#x5934;&#x75DB;&#xFF0C; &#x4E00;&#x4E2A;&#x4EBA;&#x5728;&#x5916;&#x751F;&#x75C5;&#x771F;&#x7684;&#x662F;&#x76F8;&#x5F53;&#x96BE;&#x53D7;&#x7684;&#x1F622;&#x3002;&#x4E5F;&#x957F;&#x4E86;&#x4E00;&#x4E2A;&#x8BB0;&#x6027;&#xFF0C;&#x751F;&#x75C5;&#x4E00;&#x5B9A;&#x8981;&#x7B2C;&#x4E00;&#x65F6;&#x95F4;&#x5403;&#x836F;&#xFF0C;&#x7EDD;&#x5BF9;&#x4E0D;&#x80FD;&#x62D6;&#xFF01;<br>&#x4E4B;&#x540E;&#x4E00;&#x5468;&#x57FA;&#x672C;&#x5728;&#x505A; &#x7B2C;&#x4E8C;&#x4E91;&#x8BFE;&#x5802;&#x7684;&#x4E00;&#x4E9B;&#x6587;&#x6863;&#xFF0C;&#x4FEE;&#x6539;&#xFF0C;&#x4EE5;&#x53CA;&#x4EE3;&#x7801;&#x7684;&#x7F16;&#x5199;&#x5DE5;&#x4F5C;&#xFF0C;&#x987A;&#x5E26;&#x4E5F;&#x505A;&#x4E86;&#x4E00;&#x4E2A;cocos&#x7684;&#x5C0F;&#x6E38;&#x620F;&#x3002;&#x603B;&#x4E4B;&#x770B;&#x56FE;&#x6765;&#x8BF4;&#xFF0C;&#x8FD9;&#x4E2A;&#x6708;&#x4F3C;&#x4E4E;&#x6CA1;&#x6709;&#x4E0A;&#x4E00;&#x4E2A;&#x6708;&#x5145;&#x5B9E;&#x4E00;&#x4E9B;&#xFF0C;&#x75C5;&#x771F;&#x7684;&#x5F88;&#x53EF;&#x6015; &#x5F88;&#x53EF;&#x6015; &#x5F88;&#x53EF;&#x6015;&#x3002;&#x5341;&#x6708;&#x5C31;&#x8FD9;&#x4E48;&#x8FC7;&#x53BB;&#xFF0C;&#x90A3;&#x4E48;&#x63A5;&#x4E0B;&#x6765;&#x7684;11&#x6708;&#x4E00;&#x5B9A;&#x8981;&#x597D;&#x597D;&#x89C4;&#x5212;&#x4E00;&#x4E0B;&#xFF0C;11&#x6708;&#x6CA1;&#x6709;&#x5047;&#x671F;&#xFF0C;&#x4E5F;&#x6CA1;&#x6709;&#x5176;&#x4ED6;&#x7684;&#x4E8B;&#x60C5; &#xFF0C;&#x53EF;&#x4EE5;&#x4E13;&#x5FC3;&#x4E0B;&#x6765;&#x505A;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x60C5;&#x4E86;&#x3002; &#x6BCF;&#x4E00;&#x4E2A;&#x9636;&#x6BB5;&#x90FD;&#x5B9A;&#x4E00;&#x4E2A;&#x5C0F;&#x76EE;&#x6807;&#xFF0C;&#x6BD4;&#x5982;&#x8BF4;&#xFF0C;11&#x6708;cocos2d&#x8981;&#x5165;&#x95E8;&#xFF0C;&#x5E76;&#x4E14;11&#x6708;&#x53D1;&#x5E03;&#x81EA;&#x5DF1;&#x7684;&#x7B2C;&#x4E00;&#x6B3E;app&#x9879;&#x76EE;&#xFF0C;&#x8FD8;&#x6709;&#x5176;&#x4ED6;&#x65B9;&#x9762;0&#x3002;0&#xFF08;&#x661F;&#x9645;2&#x4E0A;&#x4E00;&#x4E2A;&#x5927;&#x5E08;&#xFF09;&#x3002;<br>&#x672C;&#x5468;&#x4E5F;&#x5C31;&#x662F;10.24&#x53F7;&#x5F00;&#x59CB;&#x5B9E;&#x8BAD;&#xFF0C;&#x505A;&#x4E00;&#x4E2A;&#x7F51;&#x4E0A;&#x8BA2;&#x9910;&#x7CFB;&#x7EDF;&#xFF0C;&#x8BDD;&#x8BF4;web&#x9879;&#x76EE;&#x771F;&#x7684;&#x662F;&#x505A;&#x4E86;&#x597D;&#x591A;&#x6B21;&#x4E86;- -&#xFF0C;&#x4E0D;&#x8FC7;&#x4E00;&#x6B21;&#x6BD4;&#x4E00;&#x6B21;&#x89C4;&#x8303;&#xFF0C;&#x8FD9;&#x4E00;&#x6B21;&#x4E0D;&#x4EC5;&#x4EC5;&#x6587;&#x6863;&#x5199;&#x7684;&#x66F4;&#x597D;&#xFF0C;&#x800C;&#x4E14;&#x539F;&#x578B;&#x56FE;&#x4E5F;&#x66F4;&#x52A0;&#x6B63;&#x89C4;&#xFF0C;&#x4EFB;&#x52A1;&#x7684;&#x5206;&#x914D;&#x4E5F;&#x66F4;&#x79D1;&#x5B66;&#x4E86;&#x3002;<br>&#x9879;&#x76EE;&#x7684;&#x8BBE;&#x8BA1;&#x771F;&#x7684;&#x662F;&#x5F88;&#x8003;&#x9A8C;&#x4EBA;&#xFF0C;&#x4E0D;&#x4EC5;&#x8981;&#x8003;&#x8651;&#x529F;&#x80FD;&#xFF0C;&#x4E5F;&#x8981;&#x8003;&#x8651;ui&#x754C;&#x9762;&#x7684;&#x8BBE;&#x8BA1;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8BBE;&#x8BA1;&#xFF0C;&#x7528;&#x6237;&#x4EA4;&#x4E92;&#x7684;&#x8BBE;&#x8BA1;&#xFF0C;wow&#xFF0C;It&#x2019;s cool.</p>
<p>ps&#xFF1A;10&#x6708;&#x4EFD; &#x575A;&#x6301;&#x4E86;&#x534A;&#x4E2A;&#x6708;&#x7684;&#x5409;&#x4ED6;&#xFF0C;&#x5DE6;&#x624B;&#x7684;&#x6307;&#x809A;&#x7EC8;&#x4E8E;&#x8D77;&#x8327;&#x4E86; &#x1F604;&#xFF0C;&#x7136;&#x800C;&#x5BA4;&#x53CB;&#x56DE;&#x5B66;&#x6821;&#xFF0C;&#x6211;&#x53C8;&#x4E0D;&#x60F3;&#x7EC3;&#x5409;&#x4ED6;&#x4E86;- -&#xFF0C;&#x53EA;&#x80FD;&#x5BA4;&#x53CB;&#x79BB;&#x6821;&#x518D;&#x7EC3;&#x4E86;&#x3002;</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/09/28/yymodel/" itemprop="url">
                  YYModel解析（2）
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-09-28T02:37:09Z" content="2016-09-28">
              2016-09-28
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h1 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h1><pre><code>YYModel&#x5305;&#x542B;&#x4E86;&#x5F88;&#x591A;&#x5E95;&#x5C42;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x5C06;&#x5176;&#x4E2D;&#x7684;&#x539F;&#x7406;&#x6478;&#x900F;&#xFF0C;&#x5BF9;&#x4E8E;&#x4EE5;&#x540E;&#x5B66;&#x4E60;&#x5176;&#x4ED6;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x751A;&#x81F3;&#x81EA;&#x5DF1;&#x5199;&#x4E00;&#x4E2A;&#x6846;&#x67B6;&#xFF0C;&#x90FD;&#x6709;&#x5F88;&#x5927;&#x7684;&#x5E2E;&#x52A9;&#x3002;&#x8BDD;&#x4E0D;&#x591A;&#x8BF4;&#xFF0C;&#x7EE7;&#x7EED;&#x5206;&#x6790;&#x3002;
</code></pre><h2 id="instancetype-classInfoWithClass-Class-cls"><a href="#instancetype-classInfoWithClass-Class-cls" class="headerlink" title="+ (instancetype)classInfoWithClass:(Class)cls"></a>+ (instancetype)classInfoWithClass:(Class)cls</h2><pre><code>+ (instancetype)classInfoWithClass:(Class)cls {
    if (!cls) return nil;
    static CFMutableDictionaryRef classCache;
    static CFMutableDictionaryRef metaCache;
    static dispatch_once_t onceToken;
    static dispatch_semaphore_t lock;
    dispatch_once(&amp;onceToken, ^{
        classCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
        metaCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
        lock = dispatch_semaphore_create(1);
    });
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    NSLog(@&quot;is meta %i&quot;,class_isMetaClass(cls));
    YYClassInfo *info = CFDictionaryGetValue(class_isMetaClass(cls) ? metaCache : classCache, (__bridge const void *)(cls));
    if (info &amp;&amp; info-&gt;_needUpdate) {
        [info _update];
    }
    dispatch_semaphore_signal(lock);
    if (!info) {
        info = [[YYClassInfo alloc] initWithClass:cls];
        if (info) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            CFDictionarySetValue(info.isMeta ? metaCache : classCache, (__bridge const void *)(cls), (__bridge const void *)(info));
            dispatch_semaphore_signal(lock);
        }
    }
    return info;
}
</code></pre><p>&#x7D27;&#x63A5;&#x4E0A;&#x6B21;&#x7684;&#x5206;&#x6790;&#xFF0C;&#x6211;&#x4EEC;&#x8FDB;&#x5165;&#x5230;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x540E;&#x9996;&#x5148;&#x770B;&#x5230;&#x4E86;4&#x4E2A;&#x9759;&#x6001;&#x53D8;&#x91CF;&#x58F0;&#x660E; classCache &#x548C; metaCache &#x662F;&#x4E3A;&#x4E86;&#x7533;&#x8BF7;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#xFF0C;onceToken&#x548C;lock&#x65F6;&#x4E3A;&#x4E86;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#xFF0C;&#x4E4B;&#x540E;&#x5728;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;CFDictionaryCreateMutable&#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;&#x4E00;&#x4E2A;CFDictionary&#x7684;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#xFF0C;&#x4E4B;&#x540E;&#x6765;&#x5230;&#x8FD9;&#x4E00;&#x53E5;<br>     YYClassInfo <em>info = CFDictionaryGetValue(class_isMetaClass(cls) ? metaCache : classCache, (__bridge const void </em>)(cls));<br>&#x6BCF;&#x4E00;&#x6B21;&#x6253;&#x5370;class_isMetaClass(cls)&#x90FD;&#x4E3A;0.&#x51FA;&#x8FD9;&#x4E00;&#x53E5;&#x8BDD;&#x662F;&#x5E72;&#x561B;&#x7528;&#x7684;&#x53FB;&#xFF1F;&#x8FD9;&#x91CC;&#x5E94;&#x8BE5;&#x662F;&#x5224;&#x65AD;object&#x7684;class&#x662F;&#x5426;&#x662F;&#x5143;&#x7C7B;&#xFF0C;&#x7136;&#x540E;&#x5224;&#x65AD;&#x662F;&#x5426;&#x9700;&#x8981;&#x66F4;&#x65B0;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x66F4;&#x65B0;&#x5E94;&#x8BE5;&#x662F;class&#x5C5E;&#x6027;&#x7684;&#x6539;&#x53D8;&#xFF08; <strong>&#x6211;&#x8FDB;&#x884C;&#x4E86;&#x5404;&#x79CD;&#x6539;&#x53D8;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x4F1A;&#x8FDB;&#x5230;&#x91CC;&#x9762;&#xFF0C;&#x5148;&#x7EE7;&#x7EED;&#x5206;&#x6790;&#xFF0C;&#x7A0D;&#x540E;&#x7814;&#x7A76;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;</strong> &#xFF09;<br>&#x7136;&#x540E;&#x5230;&#x4E86;&#x5173;&#x952E;&#x7684;&#x4E00;&#x6B65;   <strong>info = [[YYClassInfo alloc] initWithClass:cls];</strong> &#x7EC8;&#x4E8E;&#x8981;&#x521D;&#x59CB;&#x5316;class&#x4E86; &#xFF0C;&#x6211;&#x4EEC;&#x8DF3;&#x8FDB;&#x53BB;&#x770B;&#x4E00;&#x770B;&#x3002;</p>
<pre><code>- (instancetype)initWithClass:(Class)cls {
    if (!cls) return nil;
    self = [super init];
    _cls = cls;
    _superCls = class_getSuperclass(cls);
    _isMeta = class_isMetaClass(cls);
    if (!_isMeta) {
        _metaCls = objc_getMetaClass(class_getName(cls));
    }
    _name = NSStringFromClass(cls);
    [self _update];

    _superClassInfo = [self.class classInfoWithClass:_superCls];
    return self;
}
</code></pre><p>_cls = cls&#x8FD9;&#x53E5;&#x5F88;&#x5BB9;&#x6613;&#x7406;&#x89E3;&#xFF0C;&#x5F53;&#x524D;&#x7C7B;&#x5C31;&#x662F;&#x4F60;&#x7684;&#x4F20;&#x5165;&#x7C7B;(&#x6253;&#x5370;&#x51FA;&#x6765;&#x7684;&#x662F;yybook)&#x3002;_superCls = class_getSuperclass(cls);(&#x7236;&#x7C7B; &#x4E5F;&#x5C31;&#x662F;NSObject)&#xFF0C; _isMeta = class_isMetaClass(cls);&#x662F;&#x4E0D;&#x662F;&#x5143;&#x7C7B;&#xFF0C;&#x5F53;&#x7136;&#x4E0D;&#x662F;&#x5143;&#x7C7B;&#x4E86;&#x3002;&#x6211;&#x4EEC;&#x5982;&#x679C;&#x6253;&#x5370;objc_getMetaClass(class_getName(cls))&#x5F97;&#x5230;&#x7684;&#x662F;yybook&#xFF0C;&#x5F53;&#x7136;yybook&#x7684;&#x5143;&#x7C7B;&#x5C31;&#x662F;yybook&#x3002;<strong>class&#x548C;metaClass&#x867D;&#x7136;&#x540D;&#x5B57;&#x4E00;&#x6837;&#xFF0C;&#x4F46;&#x4E0D;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#x7C7B;&#x3002;</strong><br>&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x8BF7;&#x770B;&#x56FE;<img src="http://www.ianisme.com/wp-content/uploads/2016/01/objective-runtime-1.png" alt=""></p>
<h3 id="void-update"><a href="#void-update" class="headerlink" title="-(void)_update"></a>-(void)_update</h3><p>_name&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x7528;&#x6765;&#x4FDD;&#x5B58;&#x8BE5;&#x7C7B;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x7136;&#x540E;&#x6267;&#x884C;_update&#x65B9;&#x6CD5;&#xFF0C;&#x6211;&#x4EEC;&#x8FDB;&#x53BB;&#x770B;&#x4E00;&#x4E0B;</p>
<pre><code>- (void)_update {
    _ivarInfos = nil;
    _methodInfos = nil;
    _propertyInfos = nil;

    &#xFF0F;&#xFF0F;&#x7B2C;&#x4E00;&#x90E8;&#x5206;
    Class cls = self.cls;
    unsigned int methodCount = 0;
    Method *methods = class_copyMethodList(cls, &amp;methodCount);
    if (methods) {
        NSMutableDictionary *methodInfos = [NSMutableDictionary new];
        _methodInfos = methodInfos;
        for (unsigned int i = 0; i &lt; methodCount; i++) {
            YYClassMethodInfo *info = [[YYClassMethodInfo alloc] initWithMethod:methods[i]];
            if (info.name) methodInfos[info.name] = info;
        }
        free(methods);
    }
    &#xFF0F;&#xFF0F;&#x7B2C;&#x4E8C;&#x90E8;&#x5206;
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList(cls, &amp;propertyCount);
    if (properties) {
        NSMutableDictionary *propertyInfos = [NSMutableDictionary new];
        _propertyInfos = propertyInfos;
        for (unsigned int i = 0; i &lt; propertyCount; i++) {
            YYClassPropertyInfo *info = [[YYClassPropertyInfo alloc] initWithProperty:properties[i]];
            if (info.name) propertyInfos[info.name] = info;
        }
        free(properties);
    }
    &#xFF0F;&#xFF0F;&#x7B2C;&#x4E09;&#x90E8;&#x5206;
    unsigned int ivarCount = 0;
    Ivar *ivars = class_copyIvarList(cls, &amp;ivarCount);
    if (ivars) {
        NSMutableDictionary *ivarInfos = [NSMutableDictionary new];
        _ivarInfos = ivarInfos;
        for (unsigned int i = 0; i &lt; ivarCount; i++) {
            YYClassIvarInfo *info = [[YYClassIvarInfo alloc] initWithIvar:ivars[i]];
            if (info.name) ivarInfos[info.name] = info;
        }
        free(ivars);
    }

    if (!_ivarInfos) _ivarInfos = @{};
    if (!_methodInfos) _methodInfos = @{};
    if (!_propertyInfos) _propertyInfos = @{};

    _needUpdate = NO;
}
</code></pre><p>&#x6765;&#x5230;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x9996;&#x5148;</p>
<ul>
<li>_ivarInfos = nil;</li>
<li>_methodInfos = nil;</li>
<li>_propertyInfos = nil;</li>
</ul>
<p>&#x8FD9;&#x4E09;&#x884C;&#x521D;&#x59CB;&#x5316;&#x8D4B;&#x7A7A;&#xFF0C;Class cls = self.cls;&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x7684;&#x7C7B;&#xFF0C; </p>
<h4 id="&#x7B2C;&#x4E00;&#x90E8;&#x5206;"><a href="#&#x7B2C;&#x4E00;&#x90E8;&#x5206;" class="headerlink" title="&#x7B2C;&#x4E00;&#x90E8;&#x5206;"></a>&#x7B2C;&#x4E00;&#x90E8;&#x5206;</h4><ul>
<li>unsigned int methodCount = 0;</li>
<li>Method *methods = class_copyMethodList(cls, &amp;methodCount);</li>
</ul>
<p>&#x7C7B;&#x65B9;&#x6CD5;&#x7684;&#x83B7;&#x53D6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x4E0B;&#x65B9;&#x6DFB;&#x52A0;</p>
<pre><code>for (int i = 0; i&lt;methodCount; i++) {
       Method method = methods[i];
       SEL methodName = method_getName(method);
       const char *name = sel_getName(methodName);
       NSLog(@&quot;%s&quot;,name);
   }
</code></pre><p>&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x83B7;&#x5F97;&#x7684;&#x65B9;&#x6CD5;&#x540D;</p>
<ul>
<li>2016-09-28 14:25:05.219 YYKitDemo[90901:1252671] pages</li>
<li>2016-09-28 14:25:05.219 YYKitDemo[90901:1252671] setPages:</li>
<li>2016-09-28 14:25:05.219 YYKitDemo[90901:1252671] publishDate6</li>
<li>2016-09-28 14:25:05.220 YYKitDemo[90901:1252671] setPublishDate6:</li>
<li>2016-09-28 14:25:05.220 YYKitDemo[90901:1252671] name</li>
<li>2016-09-28 14:25:05.220 YYKitDemo[90901:1252671] .cxx_destruct</li>
<li>2016-09-28 14:25:05.220 YYKitDemo[90901:1252671] setName:</li>
</ul>
<p>.cxx_destruct&#x662F;&#x4EC0;&#x4E48;&#x9B3C;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x8C08;&#x4E0B;&#x4E00;&#x8BDD;&#x9898;&#x3002;&#xFF08;&#xFF0D;&#xFF0D;&#xFF0D;&#x8FD9;&#x91CC;&#x6253;&#x4E2A;&#x8BB0;&#x53F7;&#xFF0C;&#x7A0D;&#x540E;&#x518D;&#x7814;&#x7A76;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF09;&#x3002;  </p>
<pre><code>if (methods) {
    NSMutableDictionary *methodInfos = [NSMutableDictionary new];
    _methodInfos = methodInfos;
    for (unsigned int i = 0; i &lt; methodCount; i++) {
        YYClassMethodInfo *info = [[YYClassMethodInfo alloc] initWithMethod:methods[i]];
        if (info.name) methodInfos[info.name] = info;
    }
    free(methods);
}
</code></pre><p>&#x8FD9;&#x91CC;&#x5B9E;&#x4F8B;&#x5316;&#x4E00;&#x4E2A;&#x53EF;&#x53D8;&#x5B57;&#x5178;&#x7C7B;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x7C7B;&#x4E2D;&#x7684;&#x65B9;&#x6CD5;&#xFF08;&#x4E5F;&#x5C31;&#x662F;method&#x53D8;&#x91CF;&#x91CC;&#x5B58;&#x7684;&#x65B9;&#x6CD5;&#x540D;&#xFF09;&#x8F6C;&#x5316;&#x6210;&#x4E00;&#x4E2A;&#x7C7B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E0B;&#x9762;</p>
<pre><code>@interface YYClassMethodInfo : NSObject
@property (nonatomic, assign, readonly) Method method;                  ///&lt; method opaque struct
@property (nonatomic, strong, readonly) NSString *name;                 ///&lt; method name
@property (nonatomic, assign, readonly) SEL sel;                        ///&lt; method&apos;s selector
@property (nonatomic, assign, readonly) IMP imp;                        ///&lt; method&apos;s implementation
@property (nonatomic, strong, readonly) NSString *typeEncoding;         ///&lt; method&apos;s parameter and return types
@property (nonatomic, strong, readonly) NSString *returnTypeEncoding;   ///&lt; return value&apos;s type
@property (nullable, nonatomic, strong, readonly) NSArray&lt;NSString *&gt; *argumentTypeEncodings; ///&lt; array of arguments&apos; type
</code></pre><p>&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x5728;runtime&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x3001; sel(&#x65B9;&#x6CD5;&#x540D;&#x79F0;) , imp&#xFF08;&#x65B9;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x5176;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;&#xFF09; &#xFF0C;name&#xFF08;&#x65B9;&#x6CD5;&#x540D;&#x79F0;&#xFF09;&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x540C;&#x540E;&#x9762;&#x7684;&#x6CE8;&#x91CA;&#x6240;&#x793A;&#x3002;&#x770B;&#x5B8C;YYClassMethodInfo&#x8FD9;&#x4E2A;&#x7C7B;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x5F00;&#x59CB;&#x770B;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5; <strong>- (instancetype)initWithMethod:(Method)method</strong></p>
<pre><code>- (instancetype)initWithMethod:(Method)method {
    if (!method) return nil;
    self = [super init];
    _method = method;
    _sel = method_getName(method);
    _imp = method_getImplementation(method);
    const char *name = sel_getName(_sel);
    if (name) {
        _name = [NSString stringWithUTF8String:name];
    }
    const char *typeEncoding = method_getTypeEncoding(method);
    if (typeEncoding) {
        _typeEncoding = [NSString stringWithUTF8String:typeEncoding];
    }
    char *returnType = method_copyReturnType(method);
    if (returnType) {
        _returnTypeEncoding = [NSString stringWithUTF8String:returnType];
        free(returnType);
    }
    unsigned int argumentCount = method_getNumberOfArguments(method);
    if (argumentCount &gt; 0) {
        NSMutableArray *argumentTypes = [NSMutableArray new];
        for (unsigned int i = 0; i &lt; argumentCount; i++) {
            char *argumentType = method_copyArgumentType(method, i);
            NSString *type = argumentType ? [NSString stringWithUTF8String:argumentType] : nil;
            [argumentTypes addObject:type ? type : @&quot;&quot;];
            if (argumentType) free(argumentType);
        }
        _argumentTypeEncodings = argumentTypes;
    }
    return self;
}
</code></pre><ul>
<li>_sel = method_getName(method);</li>
<li>_imp = method_getImplementation(method);</li>
</ul>
<p>&#x8FD9;&#x4E24;&#x53E5;&#x5F88;&#x5BB9;&#x6613;&#x7406;&#x89E3;&#xFF0C;&#x76F4;&#x63A5;&#x83B7;&#x53D6;&#x65B9;&#x6CD5;&#x7684;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x770B;&#x4E00;&#x4E0B;<strong>_typeEncoding</strong>&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x6CE8;&#x91CA;&#x662F;&#x8FD9;&#x6837;&#x5199;&#x7684;///&lt; method&#x2019;s parameter and return types&#xFF0C;&#x5C06;&#x5176;&#x6253;&#x5370;&#x4E4B;&#x540E;&#x5F97;&#x5230;&#x5982;&#x4E0B;&#x7684;&#x7ED3;&#x679C;</p>
<ul>
<li>2016-09-28 15:01:31.256 YYKitDemo[92905:1285455] type coding =  = Q16@0:8</li>
<li>2016-09-28 15:01:42.520 YYKitDemo[92905:1285455] type coding =  = v24@0:8Q16</li>
<li>2016-09-28 15:01:43.595 YYKitDemo[92905:1285455] type coding =  = @16@0:8</li>
<li>2016-09-28 15:01:44.345 YYKitDemo[92905:1285455] type coding =  = v24@0:8@16</li>
<li>2016-09-28 15:01:45.129 YYKitDemo[92905:1285455] type coding =  = @16@0:8</li>
<li>2016-09-28 15:01:45.863 YYKitDemo[92905:1285455] type coding =  = v16@0:8</li>
<li>2016-09-28 15:01:46.580 YYKitDemo[92905:1285455] type coding =  = v24@0:8@16</li>
</ul>
<p>&#x8FD9;&#x4E9B;&#x90FD;&#x662F;&#x4EC0;&#x4E48;&#x9B3C;&#xFF0D; &#xFF0D; &#x6CA1;&#x5173;&#x7CFB; &#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x8FD9;&#x7BC7;<a href="http://www.jianshu.com/p/f4129b5194c0" target="_blank" rel="external">&#x6587;&#x7AE0;</a>&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#x8FD9;7&#x4E2A;typeencoding&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x524D;&#x9762;7&#x4E2A;&#x65B9;&#x6CD5;&#x7684;string&#x503C;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x7EE7;&#x7EED;&#x770B;&#x4EE3;&#x7801;</p>
<pre><code>char *returnType = method_copyReturnType(method);
    if (returnType) {
        _returnTypeEncoding = [NSString stringWithUTF8String:returnType];
        NSLog(@&quot;returnTypeEncoding -- %@&quot;,_returnTypeEncoding);
        free(returnType);
    }
</code></pre><p>&#x8FD9;&#x91CC;&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x679C;<br>returnTypeEncoding &#x2013; @ &#x6216;&#x8005; returnTypeEncoding &#x2013; v,&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x503C;&#x7C7B;&#x578B;&#x7684;string&#x8868;&#x793A;&#x5F62;&#x5F0F;&#x3002;</p>
<pre><code>if (argumentCount &gt; 0) {
        NSMutableArray *argumentTypes = [NSMutableArray new];
        for (unsigned int i = 0; i &lt; argumentCount; i++) {
            char *argumentType = method_copyArgumentType(method, i);
            NSString *type = argumentType ? [NSString stringWithUTF8String:argumentType] : nil;
            NSLog(@&quot;type  &#xFF1D;&#xFF1D;&#xFF1D;&#xFF1D; %@&quot;,type);
            [argumentTypes addObject:type ? type : @&quot;&quot;];
            if (argumentType) free(argumentType);
        }
        _argumentTypeEncodings = argumentTypes;
    }
</code></pre><p>&#x8FD9;&#x4E00;&#x6BB5;&#x662F;&#x4EC0;&#x4E48;&#x610F;&#x601D;&#x5462;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x5176;&#x4E2D;&#x4E00;&#x6BB5;&#x7684;&#x8F93;&#x51FA;&#x7ED3;&#x679C;<br> 2016-09-28 15:58:20.679 YYKitDemo[95259:1325369] type coding =  = v24@0:8@16<br>2016-09-28 15:58:20.679 YYKitDemo[95259:1325369] returnTypeEncoding &#x2013; v<br>2016-09-28 16:01:56.587 YYKitDemo[95259:1325369] 3<br>2016-09-28 16:01:56.587 YYKitDemo[95259:1325369] type  &#xFF1D;&#xFF1D;&#xFF1D;&#xFF1D; @<br>2016-09-28 16:01:56.587 YYKitDemo[95259:1325369] type  &#xFF1D;&#xFF1D;&#xFF1D;&#xFF1D; :<br>2016-09-28 16:01:56.588 YYKitDemo[95259:1325369] type  &#xFF1D;&#xFF1D;&#xFF1D;&#xFF1D; @<br>&#x8FD9;&#x91CC;&#x9762;&#x5B58;&#x7684;&#x5C31;&#x662F;&#x51FD;&#x6570;&#x91CC;&#x7684;&#x5305;&#x542B;&#x7684;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#x3002;</p>
<p>&#x63A5;&#x7740;&#x5C06;argumenttype&#x8F6C;&#x6362;&#x6210;nsstring&#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#x4FDD;&#x5B58;&#x5230;_argumentTypeEncodings&#x7684;&#x6570;&#x7EC4;&#x4E2D;&#x3002;&#x6700;&#x540E;return self&#xFF0C;&#x81F3;&#x6B64;&#x5B8C;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x6A21;&#x578B;&#x7684;&#x5C01;&#x88C5;&#x3002;</p>
<h4 id="&#x7B2C;&#x4E8C;&#x90E8;&#x5206;"><a href="#&#x7B2C;&#x4E8C;&#x90E8;&#x5206;" class="headerlink" title="&#x7B2C;&#x4E8C;&#x90E8;&#x5206;"></a>&#x7B2C;&#x4E8C;&#x90E8;&#x5206;</h4><pre><code>&#xFF0F;&#xFF0F;&#x7B2C;&#x4E8C;&#x90E8;&#x5206;
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList(cls, &amp;propertyCount);
    if (properties) {
        NSMutableDictionary *propertyInfos = [NSMutableDictionary new];
        _propertyInfos = propertyInfos;
        for (unsigned int i = 0; i &lt; propertyCount; i++) {
            YYClassPropertyInfo *info = [[YYClassPropertyInfo alloc] initWithProperty:properties[i]];
            if (info.name) propertyInfos[info.name] = info;
        }
        free(properties);
    }
</code></pre><p>&#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x662F;&#x5BF9;propertyCount&#x7684;&#x5C01;&#x88C5;&#xFF0C;objc_property_t *properties = class_copyPropertyList(cls, &amp;propertyCount);&#x662F;&#x83B7;&#x53D6;&#x5404;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;</p>
<pre><code>/**
 Property information.
 */
@interface YYClassPropertyInfo : NSObject
@property (nonatomic, assign, readonly) objc_property_t property; ///&lt; property&apos;s opaque struct
@property (nonatomic, strong, readonly) NSString *name;           ///&lt; property&apos;s name
@property (nonatomic, assign, readonly) YYEncodingType type;      ///&lt; property&apos;s type
@property (nonatomic, strong, readonly) NSString *typeEncoding;   ///&lt; property&apos;s encoding value
@property (nonatomic, strong, readonly) NSString *ivarName;       ///&lt; property&apos;s ivar name
@property (nullable, nonatomic, assign, readonly) Class cls;      ///&lt; may be nil
@property (nullable, nonatomic, strong, readonly) NSArray&lt;NSString *&gt; *protocols; ///&lt; may nil
@property (nonatomic, assign, readonly) SEL getter;               ///&lt; getter (nonnull)
@property (nonatomic, assign, readonly) SEL setter;               ///&lt; setter (nonnull)
</code></pre><p>&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A;property&#x7684;&#x4E00;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;&#xFF0C;&#x7ED3;&#x6784;&#x4F53;&#x91CC;&#x9762;&#x4FDD;&#x5B58;&#x8FD9;&#x4E2A;property&#x7684;&#x5404;&#x79CD;&#x5C5E;&#x6027;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x662F;name&#xFF0C;YYEncodingType&#x5C5E;&#x6027;&#x7684;&#x7C7B;&#x578B;&#xFF0C;typeencoding&#x662F;&#x5C5E;&#x6027;&#x6240;&#x6709;&#x7684;&#x7C7B;&#x578B;&#x7F16;&#x7801;&#xFF0C;ivarName&#x5C31;&#x662F;&#x5C5E;&#x6027;&#x540D;&#xFF0C;&#x6BD4;&#x5982;_name&#xFF0C;protocols&#x534F;&#x8BAE;&#xFF0C;getter  &#x548C; setter &#x4E0D;&#x7528;&#x8BF4; &#x662F;&#x751F;&#x6210;&#x7684;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#x3002;<br>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x770B;  <strong>- (instancetype)initWithProperty:(objc_property_t)property</strong></p>
<pre><code>- (instancetype)initWithProperty:(objc_property_t)property
   - (instancetype)initWithProperty:(objc_property_t)property {
      //&#x7B2C;&#x4E00;&#x90E8;&#x5206;
       if (!property) return nil;
       self = [super init];
       _property = property;
       const char *name = property_getName(property);
       if (name) {
           _name = [NSString stringWithUTF8String:name];
       }

       //&#x7B2C;&#x4E8C;&#x90E8;&#x5206;
       YYEncodingType type = 0;
       unsigned int attrCount;
       objc_property_attribute_t *attrs = property_copyAttributeList(property, &amp;attrCount);
       for (unsigned int i = 0; i &lt; attrCount; i++) {
           switch (attrs[i].name[0]) {
               case &apos;T&apos;: { // Type encoding
                   if (attrs[i].value) {
                       _typeEncoding = [NSString stringWithUTF8String:attrs[i].value];
                       type = YYEncodingGetType(attrs[i].value);                        
                   if ((type &amp; YYEncodingTypeMask) == YYEncodingTypeObject &amp;&amp; _typeEncoding.length) {
                       NSScanner *scanner = [NSScanner scannerWithString:_typeEncoding];
                       if (![scanner scanString:@&quot;@\&quot;&quot; intoString:NULL]) continue;

                       NSString *clsName = nil;
                       if ([scanner scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString:@&quot;\&quot;&lt;&quot;] intoString:&amp;clsName]) {
                           if (clsName.length) _cls = objc_getClass(clsName.UTF8String);
                       }

                       NSMutableArray *protocols = nil;
                       while ([scanner scanString:@&quot;&lt;&quot; intoString:NULL]) {
                           NSString* protocol = nil;
                           if ([scanner scanUpToString:@&quot;&gt;&quot; intoString: &amp;protocol]) {
                               if (protocol.length) {
                                   if (!protocols) protocols = [NSMutableArray new];
                                   [protocols addObject:protocol];
                               }
                           }
                           [scanner scanString:@&quot;&gt;&quot; intoString:NULL];
                       }
                       _protocols = protocols;
                   }
               }
           } break;
           case &apos;V&apos;: { // Instance variable
               if (attrs[i].value) {
                   _ivarName = [NSString stringWithUTF8String:attrs[i].value];
               }
           } break;
           case &apos;R&apos;: {
               type |= YYEncodingTypePropertyReadonly;
           } break;
           case &apos;C&apos;: {
               type |= YYEncodingTypePropertyCopy;
           } break;
           case &apos;&amp;&apos;: {
               type |= YYEncodingTypePropertyRetain;
           } break;
           case &apos;N&apos;: {
               type |= YYEncodingTypePropertyNonatomic;
           } break;
           case &apos;D&apos;: {
               type |= YYEncodingTypePropertyDynamic;
           } break;
           case &apos;W&apos;: {
               type |= YYEncodingTypePropertyWeak;
           } break;
           case &apos;G&apos;: {
               type |= YYEncodingTypePropertyCustomGetter;
               if (attrs[i].value) {
                   _getter = NSSelectorFromString([NSString stringWithUTF8String:attrs[i].value]);
               }
           } break;
           case &apos;S&apos;: {
               type |= YYEncodingTypePropertyCustomSetter;
               if (attrs[i].value) {
                   _setter = NSSelectorFromString([NSString stringWithUTF8String:attrs[i].value]);
               }
           } // break; commented for code coverage in next line
           default: break;
       }


       }
       if (attrs) {
           free(attrs);
           attrs = NULL;
       }

       _type = type;
       if (_name.length) {
           if (!_getter) {
               _getter = NSSelectorFromString(_name);
           }
           if (!_setter) {
               _setter = NSSelectorFromString([NSString stringWithFormat:@&quot;set%@%@:&quot;, [_name substringToIndex:1].uppercaseString, [_name substringFromIndex:1]]);
           }
       }
       return self;
   }
</code></pre><h6 id="part-one"><a href="#part-one" class="headerlink" title="part one"></a>part one</h6><p>&#x7B2C;&#x4E00;&#x90E8;&#x5206;&#x8D4B;&#x503C;&#xFF0C;&#x5224;&#x65AD;&#x7A7A;&#x503C;&#xFF0C;&#x4F7F;&#x7528;property_getName&#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x5C5E;&#x6027;&#x540D;&#xFF0C;&#x6CA1;&#x6709;&#x4EC0;&#x4E48; &#x5185;&#x5BB9; &#xFF0C;&#x6211;&#x4EEC;&#x770B;&#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x3002;</p>
<pre><code>if (!property) return nil;
  self = [super init];
  _property = property;
  const char *name = property_getName(property);
  if (name) {
      _name = [NSString stringWithUTF8String:name];
      NSLog(@&quot;%@&quot;,_name);
  }
</code></pre><h6 id="part-two"><a href="#part-two" class="headerlink" title="part two"></a>part two</h6><p>&#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x5F88;&#x957F;&#xFF0C;&#x6211;&#x622A;&#x53D6;&#x4E3B;&#x8981;&#x7684;&#x90E8;&#x5206;</p>
<pre><code>YYEncodingType type = 0;
 unsigned int attrCount;
 objc_property_attribute_t *attrs = property_copyAttributeList(property, &amp;attrCount);
 for (unsigned int i = 0; i &lt; attrCount; i++) {
     switch (attrs[i].name[0]) {
         case &apos;T&apos;: { // Type encoding
             if (attrs[i].value) {
                 _typeEncoding = [NSString stringWithUTF8String:attrs[i].value];
                 type = YYEncodingGetType(attrs[i].value);

             if ((type &amp; YYEncodingTypeMask) == YYEncodingTypeObject &amp;&amp; _typeEncoding.length) {
                 NSScanner *scanner = [NSScanner scannerWithString:_typeEncoding];
                 if (![scanner scanString:@&quot;@\&quot;&quot; intoString:NULL]) continue;

                 NSString *clsName = nil;
                 if ([scanner scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString:@&quot;\&quot;&lt;&quot;] intoString:&amp;clsName]) {
                     if (clsName.length) _cls = objc_getClass(clsName.UTF8String);
                 }

                 NSMutableArray *protocols = nil;
                 while ([scanner scanString:@&quot;&lt;&quot; intoString:NULL]) {
                     NSString* protocol = nil;
                     if ([scanner scanUpToString:@&quot;&gt;&quot; intoString: &amp;protocol]) {
                         if (protocol.length) {
                             if (!protocols) protocols = [NSMutableArray new];
                             [protocols addObject:protocol];
                         }
                     }
                     [scanner scanString:@&quot;&gt;&quot; intoString:NULL];
                 }
                 _protocols = protocols;
             }
         }
     } break;
     case &apos;V&apos;: { // Instance variable
         if (attrs[i].value) {
             _ivarName = [NSString stringWithUTF8String:attrs[i].value];
         }
     } break;
</code></pre><p>&#x9996;&#x5148;&#x58F0;&#x660E;&#x4E86;&#x4E00;&#x4E2A;YYEncodingType&#x53D8;&#x91CF; &#x548C; &#x4E00;&#x4E2A;attrCount&#x53D8;&#x91CF;&#xFF0C;&#x63A5;&#x7740;&#x83B7;&#x53D6;objc_property_attribute_t *attrs = property_copyAttributeList(property, &amp;attrCount); &#x770B;&#x5230;attribute&#x5927;&#x5BB6;&#x6216;&#x8BB8;&#x4F1A;&#x731C;&#x5230;&#x8FD9;&#x91CC;&#x83B7;&#x53D6;&#x7684;&#x662F;&#x4EC0;&#x4E48;&#x4E86;&#xFF0C;&#x672C;&#x7740;&#x5B9E;&#x4E8B;&#x6C42;&#x662F;&#x7684;&#x539F;&#x5219;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x5B83;&#x6253;&#x5370;&#x51FA;&#x6765;&#x770B;&#x4E00;&#x4E0B;</p>
<ul>
<li>2016-09-29 09:41:06.694 YYKitDemo[11551:1551862] name</li>
<li>2016-09-29 09:41:08.442 YYKitDemo[11551:1551862] T</li>
<li>2016-09-29 09:41:08.442 YYKitDemo[11551:1551862] C</li>
<li>2016-09-29 09:41:08.443 YYKitDemo[11551:1551862] N</li>
<li>2016-09-29 09:41:08.443 YYKitDemo[11551:1551862] V</li>
</ul>
<table>
<thead>
<tr>
<th>&#x5E38;&#x7528;attribute</th>
<th>name</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>nonatomic</td>
<td>&#x201C;N&#x201D;</td>
<td>&#x201C;&#x201D;</td>
</tr>
<tr>
<td>strong/retain</td>
<td>&#x201C;&amp;&#x201D;</td>
<td>&#x201C;&#x201D;</td>
</tr>
<tr>
<td>weak</td>
<td>&#x201C;W&#x201D;</td>
<td>&#x201C;&#x201D;</td>
</tr>
<tr>
<td>&#x5C5E;&#x6027;&#x7684;&#x7C7B;&#x578B;type</td>
<td>&#x201C;T&#x201D;</td>
<td>&#x201C;@TypeName&#x201D;, eg&#xFF08;&#x4F8B;&#x5982;&#xFF09;&#x201D;@\&#x201D;NSString\&#x201D;&#x201D;</td>
</tr>
<tr>
<td>&#x5C5E;&#x6027;&#x5BF9;&#x5E94;&#x7684;&#x5B9E;&#x4F8B;&#x53D8;&#x91CF;Ivar</td>
<td>&#x201C;V&#x201D;</td>
<td>&#x201C;Ivar_name&#x201D;, eg(&#x4F8B;&#x5982;) &#x201C;_name&#x201D;</td>
</tr>
<tr>
<td>readonly</td>
<td>&#x201C;R&#x201D;</td>
<td>&#x201C;&#x201D;</td>
</tr>
<tr>
<td>getter</td>
<td>&#x201C;G&#x201D;</td>
<td>&#x201C;GetterName&#x201D;, eg(&#x4F8B;&#x5982;)&#x201D;isRight&#x201D;</td>
</tr>
<tr>
<td>setter</td>
<td>&#x201C;S&#x201D;</td>
<td>&#x201C;SetterName&#x201D;, eg(&#x4F8B;&#x5982;)&#x201D;setName&#x201D;</td>
</tr>
<tr>
<td>assign/atomic</td>
<td>&#x9ED8;&#x8BA4;&#x5373;&#x4E3A;assign&#x548C;retain</td>
<td></td>
</tr>
<tr>
<td>copy</td>
<td>&#x201C;C&#x201D;</td>
</tr>
</tbody>
</table>
<p>&#x53C2;&#x7167;&#x8FD9;&#x4E2A;&#x8868;&#x683C; &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8FD8;&#x539F;&#x4E00;&#x4E0B;NString   copy  nonatomic  &#xFF0D;&#xFF0D;v&#x5E94;&#x8BE5;&#x662F;&#x6307;&#x9488;&#x7C7B;&#x578B; void* &#x7A7A;&#x7C7B;&#x578B;&#x6307;&#x9488;&#xFF0C; &#x5982;&#x679C;&#x4F60;&#x6709;&#x66F4;&#x597D;&#x7684;&#x7B54;&#x6848;&#xFF0C;&#x8BF7;&#x544A;&#x8BC9;&#x6211;&#x3002;&#xFF08;qq:125668733&#xFF09;</p>
<p>ok&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5206;&#x6790; T &#x8FD9;&#x4E2A;&#x5224;&#x65AD;&#xFF0C;T&#x662F;&#x5C5E;&#x6027;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x5305;&#x62EC;NSString ,NSData&#x7B49;&#x7B49;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7279;&#x522B;&#x5904;&#x7406;&#x4E00;&#x4E0B;&#xFF0C;<br> _typeEncoding = [NSString stringWithUTF8String:attrs[i].value];<br> &#x9996;&#x5148;&#x8BB0;&#x5F55;&#x4E0B;&#x7C7B;&#x578B;&#x7684;string<br> type = YYEncodingGetType(attrs[i].value);<br> &#x7136;&#x540E;&#x4F7F;&#x7528;YYEncodingGetType&#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;YYEncodingType&#xFF0C;&#x6211;&#x4EEC;&#x8FDB;&#x5165;&#x5230;<strong>YYEncodingType</strong>&#x91CC;&#x9762;&#x770B;&#x4E00;&#x4E0B;</p>
<pre><code> YYEncodingType YYEncodingGetType(const char *typeEncoding) {
    char *type = (char *)typeEncoding;
    if (!type) return YYEncodingTypeUnknown;
    size_t len = strlen(type);
    if (len == 0) return YYEncodingTypeUnknown;   
YYEncodingType qualifier = 0;
bool prefix = true;
while (prefix) {
    switch (*type) {
        case &apos;r&apos;: {
            qualifier |= YYEncodingTypeQualifierConst;
            type++;
        } break;
        case &apos;n&apos;: {
            qualifier |= YYEncodingTypeQualifierIn;
            type++;
        } break;
        case &apos;N&apos;: {
            qualifier |= YYEncodingTypeQualifierInout;
            type++;
        } break;
        case &apos;o&apos;: {
            qualifier |= YYEncodingTypeQualifierOut;
            type++;
        } break;
        case &apos;O&apos;: {
            qualifier |= YYEncodingTypeQualifierBycopy;
            type++;
        } break;
        case &apos;R&apos;: {
            qualifier |= YYEncodingTypeQualifierByref;
            type++;
        } break;
        case &apos;V&apos;: {
            qualifier |= YYEncodingTypeQualifierOneway;
            type++;
        } break;
        default: { prefix = false; } break;
    }
}

len = strlen(type);
if (len == 0) return YYEncodingTypeUnknown | qualifier;

switch (*type) {
    case &apos;v&apos;: return YYEncodingTypeVoid | qualifier;
    case &apos;B&apos;: return YYEncodingTypeBool | qualifier;
    case &apos;c&apos;: return YYEncodingTypeInt8 | qualifier;
    case &apos;C&apos;: return YYEncodingTypeUInt8 | qualifier;
    case &apos;s&apos;: return YYEncodingTypeInt16 | qualifier;
    case &apos;S&apos;: return YYEncodingTypeUInt16 | qualifier;
    case &apos;i&apos;: return YYEncodingTypeInt32 | qualifier;
    case &apos;I&apos;: return YYEncodingTypeUInt32 | qualifier;
    case &apos;l&apos;: return YYEncodingTypeInt32 | qualifier;
    case &apos;L&apos;: return YYEncodingTypeUInt32 | qualifier;
    case &apos;q&apos;: return YYEncodingTypeInt64 | qualifier;
    case &apos;Q&apos;: return YYEncodingTypeUInt64 | qualifier;
    case &apos;f&apos;: return YYEncodingTypeFloat | qualifier;
    case &apos;d&apos;: return YYEncodingTypeDouble | qualifier;
    case &apos;D&apos;: return YYEncodingTypeLongDouble | qualifier;
    case &apos;#&apos;: return YYEncodingTypeClass | qualifier;
    case &apos;:&apos;: return YYEncodingTypeSEL | qualifier;
    case &apos;*&apos;: return YYEncodingTypeCString | qualifier;
    case &apos;^&apos;: return YYEncodingTypePointer | qualifier;
    case &apos;[&apos;: return YYEncodingTypeCArray | qualifier;
    case &apos;(&apos;: return YYEncodingTypeUnion | qualifier;
    case &apos;{&apos;: return YYEncodingTypeStruct | qualifier;
    case &apos;@&apos;: {
        if (len == 2 &amp;&amp; *(type + 1) == &apos;?&apos;)
            return YYEncodingTypeBlock | qualifier;
        else
            return YYEncodingTypeObject | qualifier;
    }
    default: return YYEncodingTypeUnknown | qualifier;
}
}
</code></pre><p>&#x5148;&#x770B;&#x4E00;&#x4E0B;&#x5F00;&#x5934;</p>
<ul>
<li>char <em>type = (char </em>)typeEncoding;</li>
<li>if (!type) return YYEncodingTypeUnknown;</li>
<li>size_t len = strlen(type);</li>
<li>if (len == 0) return YYEncodingTypeUnknown;</li>
</ul>
<p>&#x8FD9;&#x91CC;&#x5BF9;&#x6570;&#x636E;&#x662F;&#x5426;&#x4E3A;&#x7A7A;&#x7684;&#x5224;&#x65AD;&#x3002; </p>
<pre><code>YYEncodingType qualifier = 0;
    bool prefix = true;
    while (prefix) {
        switch (*type) {
            case &apos;r&apos;: {
                qualifier |= YYEncodingTypeQualifierConst;
                type++;
            } break;
            case &apos;n&apos;: {
                qualifier |= YYEncodingTypeQualifierIn;
                type++;
            } break;
            case &apos;N&apos;: {
                qualifier |= YYEncodingTypeQualifierInout;
                type++;
            } break;
            case &apos;o&apos;: {
                qualifier |= YYEncodingTypeQualifierOut;
                type++;
            } break;
            case &apos;O&apos;: {
                qualifier |= YYEncodingTypeQualifierBycopy;
                type++;
            } break;
            case &apos;R&apos;: {
                qualifier |= YYEncodingTypeQualifierByref;
                type++;
            } break;
            case &apos;V&apos;: {
                qualifier |= YYEncodingTypeQualifierOneway;
                type++;
            } break;
            default: { prefix = false; } break;
        }
    }
</code></pre><p>&#x8FD9;&#x91CC;&#x5BF9;&#x4E8E;type++&#x4E0D;&#x7406;&#x89E3;&#xFF0C;&#x5148;&#x628A;type&#x6253;&#x5370;&#x51FA;&#x6765;&#xFF0C;&#x6BCF;&#x6B21;type++&#x4E4B;&#x540E;&#x90FD;&#x628A;&#x7ED3;&#x679C;&#x6253;&#x5370;&#x51FA;&#x6765;&#xFF0C;&#x5F97;&#x5230;<br>@ &#x201C; N S S t r i n &#x3002;&#x3002;&#x3002;&#x3002;&#x3002;&#x3002;<br>&#x731C;&#x6D4B;&#xFF1A;&#x5BF9;&#x4E8E;&#x7C7B;&#x578B;&#x7F16;&#x7801;&#x7684;&#x4E00;&#x79CD;&#x904D;&#x5386;<br>&#x5176;&#x4E2D; |= &#x7684;&#x7B26;&#x53F7; &#x662F; &#x5F02;&#x6216; &#x8FD0;&#x7B97;&#xFF0C; &#x6BD4;&#x5982;  0001 &#xFF5C;&#xFF1D; 0010 &#xFF1D; 0011  &#xFF0C;&#x5177;&#x4F53;&#x8FD0;&#x7528;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x4E00;&#x4E2A;&#x7528;&#x6237;&#x7684;&#x6743;&#x9650; &#x662F; 0001 &#xFF0C;&#x5982;&#x679C;&#x7ED9;&#x4ED6;&#x589E;&#x52A0;&#x6743;&#x9650;A &#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x53EA;&#x8981;&#x5B9A;&#x4E49;&#x6743;&#x9650;A&#x7684;&#x6743;&#x9650;&#x662F; 0011 &#xFF0C;&#x53EA;&#x8981;&#x8FDB;&#x884C;&#x5F02;&#x6216;&#x8FD0;&#x7B97;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8D4B;&#x7ED9;&#x7528;&#x6237;&#x6743;&#x9650;&#x3002;<br>    len = strlen(type);<br>    if (len == 0) return YYEncodingTypeUnknown | qualifier;<br>&#x5BB9;&#x9519;&#x5904;&#x7406;&#x3002;</p>
<pre><code>switch (*type)
&#xFF5B;
    &#x3002;&#x3002;&#x3002;
     case &apos;@&apos;: {
            if (len == 2 &amp;&amp; *(type + 1) == &apos;?&apos;)
                return YYEncodingTypeBlock | qualifier;
            else
                return YYEncodingTypeObject | qualifier;
        }
&#xFF5D;
</code></pre><p>&#x7C7B;&#x578B;&#x5224;&#x65AD;&#xFF0C;&#x5176;&#x4E2D;case &#x2018;@&#x2019;&#x91CC;&#x9762;&#x6709;&#x4E24;&#x4E2A;&#x5224;&#x65AD;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;block&#x8FD8;&#x6709;&#x662F;&#x5426;&#x662F;object&#x3002;*(type + 1)</p>
<pre><code>if ((type &amp; YYEncodingTypeMask) == YYEncodingTypeObject &amp;&amp; _typeEncoding.length) {
                        NSScanner *scanner = [NSScanner scannerWithString:_typeEncoding];
                        if (![scanner scanString:@&quot;@\&quot;&quot; intoString:NULL]) continue;

                    NSString *clsName = nil;
                    if ([scanner scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString:@&quot;\&quot;&lt;&quot;] intoString:&amp;clsName]) {
                        if (clsName.length) _cls = objc_getClass(clsName.UTF8String);
                    }

                    NSMutableArray *protocols = nil;
                    while ([scanner scanString:@&quot;&lt;&quot; intoString:NULL]) {
                        NSString* protocol = nil;
                        if ([scanner scanUpToString:@&quot;&gt;&quot; intoString: &amp;protocol]) {
                            if (protocol.length) {
                                if (!protocols) protocols = [NSMutableArray new];
                                [protocols addObject:protocol];
                            }
                        }
                        [scanner scanString:@&quot;&gt;&quot; intoString:NULL];
                    }
                    _protocols = protocols;
                }
</code></pre>
          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/09/26/yymodel解析1/" itemprop="url">
                  第一篇博客:YYModel解析（1）
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-09-26T00:48:54Z" content="2016-09-26">
              2016-09-26
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h1 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h1><p>&#x7F51;&#x4E0A;&#x6709;&#x5F88;&#x591A;&#x4EBA;&#x5206;&#x4EAB;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x5B66;&#x4E60;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E0D;&#x8FC7;&#x81EA;&#x5DF1;&#x505A;&#x5206;&#x6790;&#x8BB0;&#x5FC6;&#x4F1A;&#x6DF1;&#x523B;&#x4E00;&#x70B9;&#xFF0C;so &#xFF0C;&#x4E0B;&#x9762;&#x5C31;&#x5F00;&#x59CB;&#x4E00;&#x6B65;&#x4E00;&#x6B65;&#x5206;&#x6790;&#x3002;</p>
<h1 id="part-one"><a href="#part-one" class="headerlink" title="part one"></a>part one</h1><h2 id="static-void-SimpleObjectExample"><a href="#static-void-SimpleObjectExample" class="headerlink" title="static void SimpleObjectExample"></a>static void SimpleObjectExample</h2><pre><code>static void NestObjectExample() {
    YYRepo *repo = [YYRepo modelWithJSON:@&quot;         \
    {                                               \
        \&quot;rid\&quot;: 123456789,                         \
        \&quot;name\&quot;: \&quot;YYKit\&quot;,                        \
        \&quot;createTime\&quot; : \&quot;2011-06-09T06:24:26Z\&quot;,  \
        \&quot;owner\&quot;: {                                \
            \&quot;uid\&quot; : 989898,                       \
            \&quot;name\&quot; : \&quot;ibireme\&quot;                  \
        } \
    }&quot;];
    NSString *repoJSON = [repo modelToJSONString];
    NSLog(@&quot;Repo: %@&quot;, repoJSON);
}
</code></pre><p>&#x8FD9;&#x91CC;&#x901A;&#x8FC7;&#x8C03;&#x7528; modelwithjson&#x65B9;&#x6CD5;&#x6765;&#x8FDB;&#x884C;json&#xFF0D;model&#x7684;&#x8F6C;&#x6362;&#xFF0C;&#x70B9;&#x51FB;&#x65B9;&#x6CD5;&#x8DF3;&#x8FDB;&#x53BB;&#x3002;</p>
<h2 id="instancetype-modelWithJSON-id-json"><a href="#instancetype-modelWithJSON-id-json" class="headerlink" title="+(instancetype)modelWithJSON:(id)json"></a>+(instancetype)modelWithJSON:(id)json</h2><pre><code>+ (instancetype)modelWithJSON:(id)json {
    NSDictionary *dic = [self _yy_dictionaryWithJSON:json];
    return [self modelWithDictionary:dic];
}
</code></pre><p>&#x8FD9;&#x91CC;&#x8C03;&#x7528;&#x4E86;&#x4E00;&#x4E2A;_yy_dictionaryWithJSON&#x65B9;&#x6CD5;&#x8FDB;&#x884C;json&#xFF0D;nsdictionary&#x7684;&#x8F6C;&#x6362;&#x3002;&#x70B9;&#x8FDB;&#x53BB;&#x770B;&#x4E00;&#x770B;</p>
<h2 id="NSDictionary-yy-dictionaryWithJSON-id-json"><a href="#NSDictionary-yy-dictionaryWithJSON-id-json" class="headerlink" title="+(NSDictionary *)_yy_dictionaryWithJSON:(id)json"></a>+(NSDictionary *)_yy_dictionaryWithJSON:(id)json</h2><pre><code>+ (NSDictionary *)_yy_dictionaryWithJSON:(id)json {
    if (!json || json == (id)kCFNull) return nil;
    NSDictionary *dic = nil;
    NSData *jsonData = nil;
    if ([json isKindOfClass:[NSDictionary class]]) {
        dic = json;
    } else if ([json isKindOfClass:[NSString class]]) {
        jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
    } else if ([json isKindOfClass:[NSData class]]) {
        jsonData = json;
    }
    if (jsonData) {
        dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
        if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
    }
    return dic;
}
</code></pre><p>&#x7B2C;&#x4E00;&#x884C;&#x5224;&#x65AD; json&#x662F;&#x5426;&#x4E3A;&#x7A7A;&#xFF0C;kCFNull &#x662F; NSNull &#x7684;&#x5355;&#x4F8B;,&#x5177;&#x4F53;&#x7684;&#x4ECB;&#x7ECD;&#x8BF7;&#x770B;<a href="http://blog.csdn.net/xunyn/article/details/8283653" target="_blank" rel="external">&#x672C;&#x6587;</a>&#x3002;&#x7136;&#x540E;&#x58F0;&#x660E;&#x4E86;NSDictionary&#x548C;NSData&#x4E24;&#x4E2A;&#x7C7B;&#xFF0C; &#x7136;&#x540E;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x5224;&#x65AD;&#xFF0C;&#x4F7F;&#x7528;oc&#x81EA;&#x5E26;&#x7684;NSJSONSerialization&#x6765;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x7684;&#x8F6C;&#x6362;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;NSDictionary&#x7C7B;&#x578B;&#x3002;</p>
<h2 id="instancetype-modelWithDictionary-NSDictionary-dictionary"><a href="#instancetype-modelWithDictionary-NSDictionary-dictionary" class="headerlink" title="+(instancetype)modelWithDictionary(NSDictionary *)dictionary"></a>+(instancetype)modelWithDictionary(NSDictionary *)dictionary</h2><pre><code>+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary {
    if (!dictionary || dictionary == (id)kCFNull) return nil;
    if (![dictionary isKindOfClass:[NSDictionary class]]) return nil;

    Class cls = [self class];
    _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls];
    if (modelMeta-&gt;_hasCustomClassFromDictionary) {
        cls = [cls modelCustomClassForDictionary:dictionary] ?: cls;
    }

    NSObject *one = [cls new];
    if ([one modelSetWithDictionary:dictionary]) return one;
    return nil;
}
</code></pre><p>&#x7EC8;&#x4E8E;&#x5230;&#x4E86;&#x5173;&#x952E;&#x4E00;&#x6B65;&#xFF0C;&#x8FD9;&#x91CC;&#x9996;&#x5148;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x7684;&#x5224;&#x65AD;&#x662F;&#x5426;&#x4E3A;&#x7A7A;&#xFF0C;&#x518D;yymodel&#x91CC;&#x5305;&#x542B;&#x4E86;&#x5F88;&#x591A;&#x7C7B;&#x578B;&#x5224;&#x65AD;&#x548C;&#x7A7A;&#x503C;&#x5224;&#x65AD;&#xFF0C;&#xFF08;&#x770B;&#x6765;&#x4E00;&#x4E2A;&#x6846;&#x67B6;&#x8981;&#x8003;&#x8651;&#x5065;&#x58EE;&#x6027;&#xFF0C;&#x8FD8;&#x6709;&#x6781;&#x5F3A;&#x7684;&#x5BB9;&#x9519;&#x6027;&#x3002;&#xFF09;<br>&#x7C7B;&#x58F0;&#x660E;class cls = [self class]&#x8FD9;&#x91CC;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x6211;&#x4EEC;&#x81EA;&#x5B9A;&#x7684;&#x7C7B;&#xFF08;&#x4E5F;&#x5C31;&#x662F;YYBook&#x7C7B;),&#x7136;&#x540E;&#x4F7F;&#x7528;_YYModelMeta&#x7C7B;,&#x8FD9;&#x4E2A;&#x7C7B;&#x662F;&#x5E72;&#x561B;&#x7528;&#x7684;&#x5462;&#xFF1F;&#x6211;&#x4EEC;&#x5148;&#x6765;&#x770B;&#x770B;&#x8FD9;&#x4E2A;&#x7C7B;</p>
<h3 id="YYModelMeta"><a href="#YYModelMeta" class="headerlink" title="_YYModelMeta"></a>_YYModelMeta</h3><pre><code>@interface _YYModelMeta : NSObject {
    @package
    YYClassInfo *_classInfo;
    /// Key:mapped key and key path, Value:_YYModelPropertyMeta.
    NSDictionary *_mapper;
    /// Array&lt;_YYModelPropertyMeta&gt;, all property meta of this model.
    NSArray *_allPropertyMetas;
    /// Array&lt;_YYModelPropertyMeta&gt;, property meta which is mapped to a key path.
    NSArray *_keyPathPropertyMetas;
    /// Array&lt;_YYModelPropertyMeta&gt;, property meta which is mapped to multi keys.
    NSArray *_multiKeysPropertyMetas;
    /// The number of mapped key (and key path), same to _mapper.count.
    NSUInteger _keyMappedCount;
    /// Model class type.
    YYEncodingNSType _nsType;

    BOOL _hasCustomWillTransformFromDictionary;
    BOOL _hasCustomTransformFromDictionary;
    BOOL _hasCustomTransformToDictionary;
    BOOL _hasCustomClassFromDictionary;
}
@end
</code></pre><p>&#x5148;&#x4ECE;&#x53C2;&#x6570;&#x8BF4;&#x8D77;</p>
<h3 id="YYClassInfo-classInfo"><a href="#YYClassInfo-classInfo" class="headerlink" title="YYClassInfo *classInfo"></a>YYClassInfo *classInfo</h3><p>&#x8FD9;&#x4E2A;&#x7C7B;&#x662F;&#x4EC0;&#x4E48;&#x610F;&#x601D;&#x5462;&#xFF1F;&#x6765;&#x770B;&#x4E00;&#x4E0B;</p>
<pre><code>@interface YYClassInfo : NSObject
@property (nonatomic, assign, readonly) Class cls; ///&lt; class object
@property (nullable, nonatomic, assign, readonly) Class superCls; ///&lt; super class object
@property (nullable, nonatomic, assign, readonly) Class metaCls;  ///&lt; class&apos;s meta class object
@property (nonatomic, readonly) BOOL isMeta; ///&lt; whether this class is meta class
@property (nonatomic, strong, readonly) NSString *name; ///&lt; class name
@property (nullable, nonatomic, strong, readonly) YYClassInfo *superClassInfo; ///&lt; super class&apos;s class info
@property (nullable, nonatomic, strong, readonly) NSDictionary&lt;NSString *, YYClassIvarInfo *&gt; *ivarInfos; ///&lt; ivars
@property (nullable, nonatomic, strong, readonly) NSDictionary&lt;NSString *, YYClassMethodInfo *&gt; *methodInfos; ///&lt; methods
@property (nullable, nonatomic, strong, readonly) NSDictionary&lt;NSString *, YYClassPropertyInfo *&gt; *propertyInfos; ///&lt; properties
@end
</code></pre><p>&#x7B2C;&#x4E00;&#x4E2A;cls &#x6307;&#x5411;&#x81EA;&#x5DF1;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;superCls&#x6307;&#x5411;&#x81EA;&#x5DF1;&#x7684;&#x7236;&#x7C7B;&#xFF0C;&#x7B2C;&#x4E09;&#x4E2A;&#x7C7B;metaCls&#x6307;&#x5411;&#x81EA;&#x5DF1;&#x7684;&#x5143;&#x7C7B;&#x3002;&#xFF08;&#x5982;&#x679C;&#x8FD9;&#x91CC;&#x6709;&#x95EE;&#x9898;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x5230;<a href="https://www.ianisme.com/ios/2019.html" target="_blank" rel="external">runtime</a>,&#x4EE5;&#x53CA;<a href="http://www.jianshu.com/p/41735c66dccb" target="_blank" rel="external">&#x7C7B;&#x7684;&#x7684;&#x5185;&#x90E8;&#x7ED3;&#x6784;</a>&#x3002;&#xFF09;&#x8FD9;&#x91CC;&#x662F;&#x5143;&#x7C7B;&#xFF08;metaClass&#xFF09;&#x548C;Class&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x8BE6;&#x7EC6;&#x7684;&#x7C7B;&#x4ECB;&#x7ECD;&#x8BF7;&#x53C2;&#x8003;<a href="http://blog.csdn.net/windyitian/article/details/19810875" target="_blank" rel="external">&#x8FD9;&#x91CC;</a><br><img src="http://images.cnitblog.com/blog/292994/201303/06190150-6424732a31c74ceaaf1c4077b3b9b7b9.png" alt=""></p>
<p>isMeta&#x5224;&#x65AD;&#x81EA;&#x5DF1;&#x662F;&#x5426;&#x662F;&#x5143;&#x7C7B;&#xFF0C;name&#x4E3A;&#x7C7B;&#x7684;&#x540D;&#x79F0;&#xFF0C;YYClassInfo&#x662F;&#x5BF9;&#x81EA;&#x5DF1;&#x7684;&#x7236;&#x7C7B;&#x7684;&#x4E00;&#x4E2A;&#x5C01;&#x88C5;&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x4E09;&#x4E2A;NSDictionary :ivarInfos,methodInfos,propertyInfos&#x662F;&#x5BF9;&#x7C7B;&#x4E2D;&#x5C5E;&#x6027;(property)&#xFF0C;&#x65B9;&#x6CD5;(method)&#xFF0C;ivar(class)&#x7684;&#x4FDD;&#x5B58;&#x3002;</p>
<h3 id="&#x5176;&#x4ED6;&#x53C2;&#x6570;"><a href="#&#x5176;&#x4ED6;&#x53C2;&#x6570;" class="headerlink" title="&#x5176;&#x4ED6;&#x53C2;&#x6570;"></a>&#x5176;&#x4ED6;&#x53C2;&#x6570;</h3><p>_mapper:&#x5B58;&#x50A8; Json key &#x4E0E; _PropertyMeta&#x5BF9;&#x8C61; &#x7684;&#x6620;&#x5C04;&#x5173;&#x7CFB;&#x5B57;&#x5178;<br>_allPropertyMetas:&#x6570;&#x7EC4;&#x5B58;&#x653E;&#x6240;&#x6709;&#x7684; PropertyMeta<br>_keyPathPropertyMetas:&#x6570;&#x7EC4;&#x5B58;&#x653E;&#x6240;&#x6709;&#x6620;&#x5C04;json keyPath &#x7684; _PropertyMeta&#x5BF9;&#x8C61;<br>_multiKeysPropertyMetas&#xFF1A;&#x6570;&#x7EC4;&#x5B58;&#x653E;&#x6240;&#x6709;&#x6620;&#x5C04;&#x591A;&#x4E2A;json key &#x7684; _PropertyMeta&#x5BF9;&#x8C61;&#xFF08;&#x4E00;&#x5BF9;&#x591A;&#xFF09;</p>
<p>NSUInteger _keyMappedCount; &#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x7684;&#x5C5E;&#x6027;&#x4E2A;&#x6570;&#xFF08;&#x6BD4;&#x5982;YYBook&#x91CC;&#x9762;&#x6709;&#x4E09;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x5982;&#x679C;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x4E2D;&#x5305;&#x542B;&#x53E6;&#x5916;&#x7684;&#x7C7B;B&#x7684;&#x8BDD;&#xFF0C;&#x7C7B;B&#x4EE5;&#x53CA;&#x5176;&#x4E2D;&#x7684;&#x5C5E;&#x6027;&#x4E0D;&#x7B97;&#x5165;&#x5176;&#x4E2D;&#xFF09;<br>_nsType&#xFF1A;&#x89E3;&#x6790;Class&#x662F;Foundation&#x7C7B;&#x578B;&#x54EA;&#x4E00;&#x79CD;<br>_hasCustomWillTransformFromDictionary&#x3001;_hasCustomTransformFromDictionary&#x3001;_hasCustomTransformToDictionary&#x3001;_hasCustomClassFromDictionary&#xFF0C;&#x4F5C;&#x7528;&#xFF1A;&#x5224;&#x65AD;YYModel&#x534F;&#x8BAE;&#x65B9;&#x6CD5;&#x662F;&#x5426;&#x5B9E;&#x73B0;<br>&#x6211;&#x4EEC;&#x5148;&#x6839;&#x636E;&#x6D41;&#x7A0B; &#x9047;&#x5230;&#x54EA;&#x4E2A;&#x53C2;&#x6570;&#x518D;&#x8BB2;&#x3002;</p>
<h2 id="instancetype-modelWithDictionary-NSDictionary-dictionary-1"><a href="#instancetype-modelWithDictionary-NSDictionary-dictionary-1" class="headerlink" title="+(instancetype)modelWithDictionary(NSDictionary *)dictionary"></a>+(instancetype)modelWithDictionary(NSDictionary *)dictionary</h2><p>&#x5148;&#x56DE;&#x5230;&#x6211;&#x4EEC;&#x7684;&#x6B65;&#x9AA4;&#x4E2D;&#x53BB;</p>
<pre><code>+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary {
    if (!dictionary || dictionary == (id)kCFNull) return nil;
    if (![dictionary isKindOfClass:[NSDictionary class]]) return nil;
    Class cls = [self class];
    _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls];
    if (modelMeta-&gt;_hasCustomClassFromDictionary) {
        cls = [cls modelCustomClassForDictionary:dictionary] ?: cls;
    }
    NSObject *one = [cls new];
    if ([one modelSetWithDictionary:dictionary]) return one;
    return nil;
}
</code></pre><p>_YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls], &#x5BF9;&#x4E00;&#x4E2A;_YYModelMeta&#x7C7B;&#x8FDB;&#x884C;&#x4E86;&#x5904;&#x7406;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x8DF3;&#x8FDB;&#x53BB;&#x770B;&#x4E00;&#x4E0B;metaWithClass&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;.</p>
<h2 id="instancetype-metaWithClass-Class-cls"><a href="#instancetype-metaWithClass-Class-cls" class="headerlink" title="+ (instancetype)metaWithClass:(Class)cls"></a>+ (instancetype)metaWithClass:(Class)cls</h2><pre><code>+ (instancetype)metaWithClass:(Class)cls {
    if (!cls) return nil;
    static CFMutableDictionaryRef cache;
    static dispatch_once_t onceToken;
    static dispatch_semaphore_t lock;
    dispatch_once(&amp;onceToken, ^{
        cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
        lock = dispatch_semaphore_create(1);
    });
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    _YYModelMeta *meta = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
   NSDictionary *obj = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
    NSLog(@&quot;obj -- %@&quot;,obj);
    NSLog(@&quot;cache - %@&quot;,cache);
    dispatch_semaphore_signal(lock);
    if (!meta ) {
        meta = [[_YYModelMeta alloc] initWithClass:cls];
        if (meta) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            CFDictionarySetValue(cache, (__bridge const void *)(cls), (__bridge const void *)(meta));
            dispatch_semaphore_signal(lock);
        }
    }
    return meta;
}
</code></pre><p>&#x8FD9;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x5F00;&#x59CB;&#x6D89;&#x53CA;&#x5230;&#x5E95;&#x5C42;&#x7684;&#x4E00;&#x4E9B;&#x4EE3;&#x7801;&#xFF0C;&#x5176;&#x4E2D;&#x6709;cf&#x6846;&#x67B6;&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x7EC4;c&#x8BED;&#x8A00;&#x63A5;&#x53E3;&#xFF0C;&#x901A;&#x8FC7;&#x8C03;&#x7528;&#x5E95;&#x5C42;&#x7684;c&#x53EF;&#x4EE5;&#x4F7F;&#x5F97;&#x4EE3;&#x7801;&#x7684;&#x8FD0;&#x884C;&#x6548;&#x7387;&#x5927;&#x5927;&#x63D0;&#x9AD8;&#x3002;( YYKit&#x7684;&#x6548;&#x7387;&#x9AD8;&#x4E8E;&#x73B0;&#x5728;&#x5176;&#x4ED6;&#x7684;&#x4E3B;&#x6D41;&#x6846;&#x67B6;&#x3002;&#x6548;&#x7387;&#x5BF9;&#x6BD4;&#x8BF7;&#x770B;<a href="http://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/" target="_blank" rel="external">&#x8FD9;&#x91CC;</a>)&#x3002;&#x5F00;&#x59CB;&#x4ECD;&#x7136;&#x662F;&#x662F;&#x5426;&#x4E3A;&#x7A7A;&#x7684;&#x5224;&#x65AD;&#xFF0C;&#x7136;&#x540E;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x4EE5;CF&#x5F00;&#x5934;&#x7684;CFMutableDictionaryRef&#x7684;&#x58F0;&#x660E;&#xFF0C;dispatch_once_t  &#x7EBF;&#x7A0B;&#x7684;&#x4E00;&#x4E2A;&#x5355;&#x4F8B;,dispatch_semaphore_t &#x7EBF;&#x7A0B;&#x7684;&#x9501;(&#x8FD9;&#x91CC;&#x662F;&#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x591A;&#x7EBF;&#x7A0B;&#x9020;&#x6210;&#x7684;&#x6570;&#x636E;&#x9519;&#x8BEF;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x9632;&#x6B62;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x6539;&#x53D8;&#x540C;&#x4E00;&#x6570;&#x636E;)&#x3002;<br>dispatch_once(GCD&#xFF0C;&#x8BE5;&#x51FD;&#x6570;&#x53EA;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x4E4B;&#x540E;&#x4FBF;&#x4E0D;&#x5728;&#x6267;&#x884C;&#xFF0C;&#x60F3;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x8BF7;&#x770B;<a href="http://www.dreamingwish.com/article/gcd-guide-dispatch-once-1.html" target="_blank" rel="external">&#x8FD9;&#x91CC;</a>)&#x3002;<br>cache&#xFF08;&#x7F13;&#x5B58;&#xFF09;&#x987E;&#x540D;&#x601D;&#x4E49; &#x662F;&#x7528;&#x6765;&#x5B58;&#x653E;&#x6570;&#x636E;&#x7684;&#xFF0C;&#x4E4B;&#x540E;&#x7684;&#x65B9;&#x6CD5;CFDictionaryCreateMutable&#x65B9;&#x6CD5;&#x4E3A;cache&#x7533;&#x8BF7;&#x4E86;&#x4E00;&#x5757;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#x7528;&#x6765;&#x5B58;&#x653E;&#x7C7B;&#x7684;&#x76F8;&#x5173;&#x6570;&#x636E;&#x3002;lock&#x89E3;&#x9501;&#x3002;&#xFF08;&#x60F3;&#x4E86;&#x89E3;CFMutableDictionaryRef&#x7684;&#x540C;&#x5B66;&#x8BF7;&#x770B;<a href="http://www.jianshu.com/p/45a974fafa7c" target="_blank" rel="external">&#x8FD9;&#x91CC;</a>&#xFF09;<br>&#x56E0;&#x4E3A;&#x7B2C;&#x4E00;&#x6B21;&#x8C03;&#x7528;metaWithClass:(class)cls&#x7684;&#x65F6;&#x5019;cls&#x8F6C;&#x6362;meta&#x4E3A;nil&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x8FDB;&#x5165;&#x5230;644&#x884C;meta = [[_YYModelMeta alloc] initWithClass:cls];</p>
<h2 id="instancetype-initWithClass-Class-cls"><a href="#instancetype-initWithClass-Class-cls" class="headerlink" title="-(instancetype)initWithClass:(Class)cls"></a>-(instancetype)initWithClass:(Class)cls</h2><p>&#x8DF3;&#x8FDB;-(instancetype)initWithClass:(Class)cls &#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;&#x5367;&#x69FD;&#xFF0C;200&#x591A;&#x884C;&#x4EE3;&#x7801;&#x5728;&#x7B49;&#x7740;&#x4F60;&#xFF0C;&#x5F88;&#x5F3A;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x4ECE;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x7684;&#x7B2C;&#x4E00;&#x884C;&#x5F00;&#x59CB;&#xFF08;&#x4EE3;&#x7801;&#x597D;&#x957F;&#x6211;&#x5C31;&#x4E0D;&#x6574;&#x4E2A;&#x8D34;&#x4E86;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x6253;&#x5F00;xcode&#x81EA;&#x5DF1;&#x67E5;&#x770B;&#xFF09;&#xFF0C;</p>
<ul>
<li><p>(instancetype)classInfoWithClass:(Class)cls  &#x7B2C;&#x4E00;&#x884C;,&#x5367;&#x69FD;&#x53C8;&#x662F;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x597D; &#x518D;&#x8DF3;&#x3002;</p>
<h2 id="instancetype-classInfoWithClass-Class-cls"><a href="#instancetype-classInfoWithClass-Class-cls" class="headerlink" title="+ (instancetype)classInfoWithClass:(Class)cls"></a>+ (instancetype)classInfoWithClass:(Class)cls</h2><ul>
<li>(instancetype)classInfoWithClass:(Class)cls {<br>  if (!cls) return nil;<br>  static CFMutableDictionaryRef classCache;<br>  static CFMutableDictionaryRef metaCache;<br>  static dispatch_once_t onceToken;<br>  static dispatch_semaphore_t lock;<br>  dispatch_once(&amp;onceToken, ^{<pre><code>classCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
metaCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
lock = dispatch_semaphore_create(1);
</code></pre>  });<br>  dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);<br>  NSLog(@&#x201D;is meta %i&#x201D;,class_isMetaClass(cls));<br>  YYClassInfo <em>info = CFDictionaryGetValue(class_isMetaClass(cls) ? metaCache : classCache, (__bridge const void </em>)(cls));<br>  if (info &amp;&amp; info-&gt;_needUpdate) {<pre><code>[info _update];
</code></pre>  }<br>  dispatch_semaphore_signal(lock);<br>  if (!info) {<pre><code>info = [[YYClassInfo alloc] initWithClass:cls];
if (info) {
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    CFDictionarySetValue(info.isMeta ? metaCache : classCache, (__bridge const void *)(cls), (__bridge const void *)(info));
    dispatch_semaphore_signal(lock);
}
</code></pre>  }<br>  return info;<br>}</li>
</ul>
</li>
</ul>
<p>&#x6709;&#x4E86;&#x524D;&#x9762;&#x7684;&#x5206;&#x6790;&#xFF0C;&#x5BF9;&#x4E8E;&#x8FD9;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;&#x662F;&#x4E0D;&#x662F;&#x89C9;&#x5F97;&#x5F88;&#x5BB9;&#x6613;&#x4E0A;&#x624B;&#xFF1F;<br>&#x672A;&#x5B8C;&#x5F85;&#x7EED;&#x3002;&#x3002;</p>
<p>&#x5E7F;&#x5EA6;&#x51B3;&#x5B9A;&#x4E86;&#x6DF1;&#x5EA6;&#xFF0C;&#x8FD9;&#x53E5;&#x8BDD;&#x5E94;&#x8BE5;&#x662F;&#x6CA1;&#x9519;&#x7684;&#xFF0C;&#x8D8A;&#x6DF1;&#x5C42;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x5C31;&#x8D8A;&#x9700;&#x8981;&#x4F60;&#x6709;&#x5F88;&#x5E7F;&#x7684;&#x77E5;&#x8BC6;&#x9762;&#x624D;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#xFF0C;&#x5C31;&#x90A3;&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;&#x6765;&#x8BF4;&#xFF0C;&#x4E00;&#x4E2A;yymodel&#x6D89;&#x53CA;&#x5230;&#x4E86;&#x5F88;&#x591A;&#x77E5;&#x8BC6;&#x70B9;&#xFF0C;&#x76F8;&#x4FE1;&#x5206;&#x6790;&#x5B8C;&#x6BD5;&#x4E4B;&#x540E;&#xFF0C;&#x5BF9;&#x5176;&#x4ED6;&#x7684;&#x77E5;&#x8BC6;&#x4E5F;&#x80FD;&#x5FEB;&#x901F;&#x638C;&#x63E1;&#xFF0C;&#x6CA1;&#x9519;&#xFF0C;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x6765;&#xFF1D; &#xFF1D;&#x3002;<br>&#xFF08;YYModel &#x2014; &#x9AD8;&#x6027;&#x80FD;&#x7684; iOS JSON &#x6A21;&#x578B;&#x6846;&#x67B6;&#x3002;<br>YYCache &#x2014; &#x9AD8;&#x6027;&#x80FD;&#x7684; iOS &#x7F13;&#x5B58;&#x6846;&#x67B6;&#x3002;<br>YYImage &#x2014; &#x529F;&#x80FD;&#x5F3A;&#x5927;&#x7684; iOS &#x56FE;&#x50CF;&#x6846;&#x67B6;&#x3002;<br>YYWebImage &#x2014; &#x9AD8;&#x6027;&#x80FD;&#x7684; iOS &#x5F02;&#x6B65;&#x56FE;&#x50CF;&#x52A0;&#x8F7D;&#x6846;&#x67B6;&#x3002;<br>YYText &#x2014; &#x529F;&#x80FD;&#x5F3A;&#x5927;&#x7684; iOS &#x5BCC;&#x6587;&#x672C;&#x6846;&#x67B6;&#x3002;<br>YYKeyboardManager &#x2014; iOS &#x952E;&#x76D8;&#x76D1;&#x542C;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#x3002;<br>YYDispatchQueuePool &#x2014; iOS &#x5168;&#x5C40;&#x5E76;&#x53D1;&#x961F;&#x5217;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#x3002;<br>YYAsyncLayer &#x2014; iOS &#x5F02;&#x6B65;&#x7ED8;&#x5236;&#x4E0E;&#x663E;&#x793A;&#x7684;&#x5DE5;&#x5177;&#x3002;<br>YYCategories &#x2014; &#x529F;&#x80FD;&#x4E30;&#x5BCC;&#x7684; Category &#x7C7B;&#x578B;&#x5DE5;&#x5177;&#x5E93;&#x3002;&#xFF09;</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
  </section>

  


          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      

      <section class="site-overview sidebar-panel  sidebar-panel-active ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/images/avatar.gif"
               alt="Motom" />
          <p class="site-author-name" itemprop="name">Motom</p>
          <p class="site-description motion-element" itemprop="description">Hi! 欢迎来到我的博客，希望这里的知识能够帮助到你！</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">3</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          

          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        

      </section>

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2016</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">Motom</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Muse
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  

  

  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  



  




  
  

  

  

  

</body>
</html>
